home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
cug173.zip
/
LANDY.LXI
< prev
next >
Wrap
Text File
|
1983-12-26
|
2KB
|
90 lines
/*
* An example of LEX and YACC working together
*/
letter = [A-Za-z_$];
digit = [0-9];
white = [\n\r\t ];
%{
#include "std.h" /* Standard C conventions */
#include "landy.h" /* %term definitions from YACC, i.e. -h output file */
char yytext[100]; /* Communication with YACC actions */
int yyival; /* " " " " */
float yyfval; /* " " " " */
%}
%%
letter(letter|digit)* {gettoken(yytext, sizeof(yytext));
printf("LEX/TCON: %s\n", yytext);
return(TCON);}
[-]*(digit)*(digit) {{
register char *p = yytext; BOOLEAN minus = FALSE;
gettoken(yytext, sizeof(yytext));
yyival = 0;
if(*p == '-') {
++p;
minus = TRUE;
}
do {
if(*p != ',')
yyival = 10*yyival + (*p - '0');
} while(*++p);
if(minus) yyival = -yyival;
printf("LEX/ICON: %d\n", yyival);
return(ICON);
}}
[-]*(digit)*"."(digit)* {{
register char *p = yytext; long decimal = 0; BOOLEAN minus = FALSE;
gettoken(yytext, sizeof(yytext));
yyfval = 0.0;
if(*p == '-') {
++p;
minus = TRUE;
}
do {
switch(*p) {
case ',': break;
case '.': decimal = 10; break;
default : if(!decimal) {
yyfval = 10. * (yyfval) + (*p - '0');
break;
} else {
yyfval = yyfval + (*p - '0')/((float) decimal);
decimal *= 10;
break;
}
}
} while (*++p);
if(minus) yyfval = -yyfval;
printf("LEX/FCON: %f\n", yyfval);
return(FCON);
}}
white(white)* {return(LEXSKIP);}
%%
/*
* Hand-crafted lexgetc to give newline prompt.
*/
lexgetc(){
static BOOLEAN newline = TRUE;
register int c;
if(newline)
printf(">");
if((c = getc(lexin)) == '\n')
newline = TRUE;
else
newline = FALSE;
return(c);
}